-
Notifications
You must be signed in to change notification settings - Fork 29
p-ata #102
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
p-ata #102
Conversation
bench to readme and other various updates
discm constants
Co-authored-by: Fernando Otero <[email protected]>
Co-authored-by: Fernando Otero <[email protected]>
| if accounts.len() < 7 { | ||
| return Err(ProgramError::NotEnoughAccountKeys); | ||
| } | ||
|
|
||
| // SAFETY: account len already checked | ||
| unsafe { | ||
| Ok(RecoverNestedAccounts { | ||
| nested_associated_token_account: accounts.get_unchecked(0), | ||
| nested_mint: accounts.get_unchecked(1), | ||
| destination_associated_token_account: accounts.get_unchecked(2), | ||
| owner_associated_token_account: accounts.get_unchecked(3), | ||
| owner_mint: accounts.get_unchecked(4), | ||
| wallet: accounts.get_unchecked(5), | ||
| token_program: accounts.get_unchecked(6), | ||
| }) | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same pattern here:
| if accounts.len() < 7 { | |
| return Err(ProgramError::NotEnoughAccountKeys); | |
| } | |
| // SAFETY: account len already checked | |
| unsafe { | |
| Ok(RecoverNestedAccounts { | |
| nested_associated_token_account: accounts.get_unchecked(0), | |
| nested_mint: accounts.get_unchecked(1), | |
| destination_associated_token_account: accounts.get_unchecked(2), | |
| owner_associated_token_account: accounts.get_unchecked(3), | |
| owner_mint: accounts.get_unchecked(4), | |
| wallet: accounts.get_unchecked(5), | |
| token_program: accounts.get_unchecked(6), | |
| }) | |
| } | |
| let [nested_associated_token_account, nested_mint, destination_associated_token_account, owner_associated_token_account, owner_associated_token_account, owner_mint, wallet, token_program @ ..] = | |
| accounts | |
| else { | |
| return Err(ProgramError::NotEnoughAccountKeys); | |
| }; | |
| Ok(RecoverNestedAccounts { | |
| nested_associated_token_account, | |
| nested_mint, | |
| destination_associated_token_account, | |
| owner_associated_token_account, | |
| owner_mint, | |
| wallet, | |
| token_program, | |
| }) | |
| } |
| pub(crate) fn load_token_account(account: &AccountInfo) -> Result<&TokenAccount, ProgramError> { | ||
| let account_data = account.try_borrow_data()?; | ||
| if !valid_token_account_data(&account_data) { | ||
| return Err(ProgramError::InvalidAccountData); | ||
| } | ||
| // SAFETY: We've validated the account data structure above | ||
| unsafe { Ok(&*(account_data.as_ptr() as *const TokenAccount)) } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Getting the raw pointer (line 164) from the Ref (line 159) is problematic. The Ref keeps track of borrows, but when this method finished, it will be drop and reset the borrow state. At the same time, the pointer will be live and can lead to UB if there is a mutable borrow after calling this method.
The safe way to implement this is to map the Ref's data reference to a TokenAccount reference, so the Ref stays alive while the reference is alive.
| pub(crate) fn load_token_account(account: &AccountInfo) -> Result<&TokenAccount, ProgramError> { | |
| let account_data = account.try_borrow_data()?; | |
| if !valid_token_account_data(&account_data) { | |
| return Err(ProgramError::InvalidAccountData); | |
| } | |
| // SAFETY: We've validated the account data structure above | |
| unsafe { Ok(&*(account_data.as_ptr() as *const TokenAccount)) } | |
| } | |
| pub(crate) fn load_token_account(account: &AccountInfo) -> Result<Ref<TokenAccount>, ProgramError> { | |
| let account_data = account.try_borrow_data()?; | |
| if !valid_token_account_data(&account_data) { | |
| return Err(ProgramError::InvalidAccountData); | |
| } | |
| // SAFETY: We've validated the account data structure above | |
| Ok(Ref::map(account_data, |data| unsafe { | |
| &*(data.as_ptr() as *const TokenAccount) | |
| }) | |
| } |
| AccountMeta { | ||
| pubkey: recover_accounts.nested_associated_token_account.key(), | ||
| is_writable: true, | ||
| is_signer: false, | ||
| }, | ||
| AccountMeta { | ||
| pubkey: recover_accounts.nested_mint.key(), | ||
| is_writable: false, | ||
| is_signer: false, | ||
| }, | ||
| AccountMeta { | ||
| pubkey: recover_accounts.destination_associated_token_account.key(), | ||
| is_writable: true, | ||
| is_signer: false, | ||
| }, | ||
| AccountMeta { | ||
| pubkey: recover_accounts.owner_associated_token_account.key(), | ||
| is_writable: false, | ||
| is_signer: true, | ||
| }, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can use the constructors:
| AccountMeta { | |
| pubkey: recover_accounts.nested_associated_token_account.key(), | |
| is_writable: true, | |
| is_signer: false, | |
| }, | |
| AccountMeta { | |
| pubkey: recover_accounts.nested_mint.key(), | |
| is_writable: false, | |
| is_signer: false, | |
| }, | |
| AccountMeta { | |
| pubkey: recover_accounts.destination_associated_token_account.key(), | |
| is_writable: true, | |
| is_signer: false, | |
| }, | |
| AccountMeta { | |
| pubkey: recover_accounts.owner_associated_token_account.key(), | |
| is_writable: false, | |
| is_signer: true, | |
| }, | |
| AccountMeta::writable( | |
| recover_accounts.nested_associated_token_account.key() | |
| ), | |
| AccountMeta::readonly( | |
| recover_accounts.nested_mint.key() | |
| ), | |
| AccountMeta::writable( | |
| recover_accounts.destination_associated_token_account.key() | |
| ), | |
| AccountMeta::readonly_signer( | |
| recover_accounts.owner_associated_token_account.key() | |
| ), |
| invoke_signed( | ||
| &ix_close, | ||
| &[ | ||
| recover_accounts.nested_associated_token_account, | ||
| recover_accounts.wallet, | ||
| recover_accounts.owner_associated_token_account, | ||
| ], | ||
| &[pda_signer], | ||
| )?; | ||
| Ok(()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit:
| invoke_signed( | |
| &ix_close, | |
| &[ | |
| recover_accounts.nested_associated_token_account, | |
| recover_accounts.wallet, | |
| recover_accounts.owner_associated_token_account, | |
| ], | |
| &[pda_signer], | |
| )?; | |
| Ok(()) | |
| invoke_signed( | |
| &ix_close, | |
| &[ | |
| recover_accounts.nested_associated_token_account, | |
| recover_accounts.wallet, | |
| recover_accounts.owner_associated_token_account, | |
| ], | |
| &[pda_signer], | |
| ) |
| AccountMeta { | ||
| pubkey: recover_accounts.nested_associated_token_account.key(), | ||
| is_writable: true, | ||
| is_signer: false, | ||
| }, | ||
| AccountMeta { | ||
| pubkey: recover_accounts.wallet.key(), | ||
| is_writable: true, | ||
| is_signer: false, | ||
| }, | ||
| AccountMeta { | ||
| pubkey: recover_accounts.owner_associated_token_account.key(), | ||
| is_writable: false, | ||
| is_signer: true, | ||
| }, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| AccountMeta { | |
| pubkey: recover_accounts.nested_associated_token_account.key(), | |
| is_writable: true, | |
| is_signer: false, | |
| }, | |
| AccountMeta { | |
| pubkey: recover_accounts.wallet.key(), | |
| is_writable: true, | |
| is_signer: false, | |
| }, | |
| AccountMeta { | |
| pubkey: recover_accounts.owner_associated_token_account.key(), | |
| is_writable: false, | |
| is_signer: true, | |
| }, | |
| AccountMeta::writable( | |
| recover_accounts.nested_associated_token_account.key() | |
| ), | |
| AccountMeta::writable( | |
| recover_accounts.wallet.key() | |
| ), | |
| AccountMeta::readonly_signer( | |
| recover_accounts.owner_associated_token_account.key() | |
| ), |
| let get_size_metas = &[AccountMeta { | ||
| pubkey: mint_account.key(), | ||
| is_writable: false, | ||
| is_signer: false, | ||
| }]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| let get_size_metas = &[AccountMeta { | |
| pubkey: mint_account.key(), | |
| is_writable: false, | |
| is_signer: false, | |
| }]; | |
| let get_size_metas = &[AccountMeta::readonly( | |
| mint_account.key() | |
| )]; |
| /// - All bump hints are validated for canonicality | ||
| /// - `token_account_len` is bounded by `MAX_SANE_ACCOUNT_LENGTH` | ||
| #[inline(always)] | ||
| pub fn process_instruction( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
general comment: wonder if you tried to "prioritize" a potential common path? For example, keep it like the original ATA and encapsulating the logic to parse the instruction data (if needed) inside process_create_associated_token_account. Sometimes it helps CU-wise to have simpler match statements.
| known_token_account_len, | ||
| )?; | ||
|
|
||
| match create_accounts.rent_sysvar { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The rent_sysvar seems to be used only to compute the minimal rent but at this point you already have the space. You could calculate the rent requirement here and replace the match statement with something like:
let minimum_balance = if let Some(rent_sysvar_info) = create_accounts.rent_sysvar {
let rent = unsafe { Rent::from_account_info_unchecked(rent_sysvar_info)? };
rent.minimum_balance(space)
} else {
Rent::get()?.minimum_balance(space)
};
create_and_initialize_ata(...)| while better_bump > expected_bump { | ||
| let maybe_better_address = derive_address::<3>(seeds, Some(better_bump), program_id); | ||
| if is_off_curve(&maybe_better_address) { | ||
| log!("Canonical address does not match provided address. Canonical bump is {}, with address {}.", better_bump, &maybe_better_address); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure if you are expecting the log! to print the pubkey in base58 – as it is it will print the bytes.
* build(deps-dev): bump zx from 8.6.1 to 8.6.2 (solana-program#104) Bumps [zx](https://github.com/google/zx) from 8.6.1 to 8.6.2. - [Release notes](https://github.com/google/zx/releases) - [Commits](google/zx@8.6.1...8.6.2) --- updated-dependencies: - dependency-name: zx dependency-version: 8.6.2 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps-dev): bump zx from 8.6.2 to 8.7.0 (solana-program#105) Bumps [zx](https://github.com/google/zx) from 8.6.2 to 8.7.0. - [Release notes](https://github.com/google/zx/releases) - [Commits](google/zx@8.6.2...8.7.0) --- updated-dependencies: - dependency-name: zx dependency-version: 8.7.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps-dev): bump zx from 8.7.0 to 8.7.1 (solana-program#107) Bumps [zx](https://github.com/google/zx) from 8.7.0 to 8.7.1. - [Release notes](https://github.com/google/zx/releases) - [Commits](google/zx@8.7.0...8.7.1) --- updated-dependencies: - dependency-name: zx dependency-version: 8.7.1 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * deps: Update Solana v2.3.4 and rust toolchain (solana-program#106) #### Problem The v2.3 Solana crates are out, and the toolchain on this repo is a bit old. #### Summary of changes Bump the Solana version, crates, and rust toolchain. * build(deps): bump solana-program from 2.2.1 to 2.3.0 (solana-program#108) * build(deps): bump solana-program from 2.2.1 to 2.3.0 Bumps [solana-program](https://github.com/anza-xyz/solana-sdk) from 2.2.1 to 2.3.0. - [Release notes](https://github.com/anza-xyz/solana-sdk/releases) - [Commits](https://github.com/anza-xyz/solana-sdk/compare/[email protected]@v2.3.0) --- updated-dependencies: - dependency-name: solana-program dependency-version: 2.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> * Fixup deprecations --------- Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jon C <[email protected]> * build(deps): bump solana-program-test from 2.3.4 to 2.3.5 (solana-program#109) Bumps [solana-program-test](https://github.com/anza-xyz/agave) from 2.3.4 to 2.3.5. - [Release notes](https://github.com/anza-xyz/agave/releases) - [Changelog](https://github.com/anza-xyz/agave/blob/master/CHANGELOG.md) - [Commits](anza-xyz/agave@v2.3.4...v2.3.5) --- updated-dependencies: - dependency-name: solana-program-test dependency-version: 2.3.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump solana-program-test from 2.3.5 to 2.3.6 (solana-program#111) Bumps [solana-program-test](https://github.com/anza-xyz/agave) from 2.3.5 to 2.3.6. - [Release notes](https://github.com/anza-xyz/agave/releases) - [Changelog](https://github.com/anza-xyz/agave/blob/master/CHANGELOG.md) - [Commits](anza-xyz/agave@v2.3.5...v2.3.6) --- updated-dependencies: - dependency-name: solana-program-test dependency-version: 2.3.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps-dev): bump zx from 8.7.1 to 8.7.2 (solana-program#112) Bumps [zx](https://github.com/google/zx) from 8.7.1 to 8.7.2. - [Release notes](https://github.com/google/zx/releases) - [Commits](google/zx@8.7.1...8.7.2) --- updated-dependencies: - dependency-name: zx dependency-version: 8.7.2 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * interface: Add instruction definition, refactor some (solana-program#113) * interface: Add instruction definition, refactor some #### Problem In order to publish the v3 SDK crates and have them usable in Agave, we also need to have SPL crates using the v3 SDK crates. However, we have a circular dependency between Agave and SPL which currently makes this impossible. The overall plan is to have Agave only use "interface" crates from SPL, which have no dependencies on Agave crates. You can see more info about the project at https://github.com/orgs/anza-xyz/projects/27 ATA is already in a good position since it has a small "interface"-style crate for Agave to use. However, it has two issues: * the instruction definition is still in the program, and Agave needs that to deserialize instructions * the name of the crate is "spl-associated-token-account-client", which is inconsistent with how we normally name these #### Summary of changes Move the instruction definition into the interface crate, gated with the "borsh" feature for those who need it. Rename the crate to "spl-associated-token-account-interface". * Add required feature to borsh dep * Run cargo fmt * Bump version down to v1 for first release * CI: Update git-cliff action to v4 (solana-program#114) #### Problem The v3 git-cliff action is very out of date, but still being used by this repo. #### Summary of changes Bump the git-cliff action version to v4. * CI: Fix git-cliff args (solana-program#115) #### Problem The current yaml isn't actually recognized for the publish job. #### Summary of changes Remove some quotes. While I was at it, I also fixed the tag to `HEAD` instead of `main`, which is useful in case we ever add backport branches. * build(deps-dev): bump typescript from 5.8.3 to 5.9.2 (solana-program#116) Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.8.3 to 5.9.2. - [Release notes](https://github.com/microsoft/TypeScript/releases) - [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release-publish.yml) - [Commits](microsoft/TypeScript@v5.8.3...v5.9.2) --- updated-dependencies: - dependency-name: typescript dependency-version: 5.9.2 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps-dev): bump zx from 8.7.2 to 8.8.0 (solana-program#117) Bumps [zx](https://github.com/google/zx) from 8.7.2 to 8.8.0. - [Release notes](https://github.com/google/zx/releases) - [Commits](google/zx@8.7.2...8.8.0) --- updated-dependencies: - dependency-name: zx dependency-version: 8.8.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * deps: Bump sdk to v3, decouple from program (solana-program#118) #### Problem The sdk v3 crates are out, but the ATA interface is still on v2. #### Summary of changes Bump the deps to v3, and make the program depend on the crates version of the ATA interface to make the build possible. * chore: Release * build(deps): bump solana-program-test from 2.3.6 to 2.3.7 (solana-program#121) Bumps [solana-program-test](https://github.com/anza-xyz/agave) from 2.3.6 to 2.3.7. - [Release notes](https://github.com/anza-xyz/agave/releases) - [Changelog](https://github.com/anza-xyz/agave/blob/master/CHANGELOG.md) - [Commits](anza-xyz/agave@v2.3.6...v2.3.7) --- updated-dependencies: - dependency-name: solana-program-test dependency-version: 2.3.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump thiserror from 2.0.12 to 2.0.14 (solana-program#122) Bumps [thiserror](https://github.com/dtolnay/thiserror) from 2.0.12 to 2.0.14. - [Release notes](https://github.com/dtolnay/thiserror/releases) - [Commits](dtolnay/thiserror@2.0.12...2.0.14) --- updated-dependencies: - dependency-name: thiserror dependency-version: 2.0.14 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump thiserror from 2.0.14 to 2.0.15 (solana-program#124) Bumps [thiserror](https://github.com/dtolnay/thiserror) from 2.0.14 to 2.0.15. - [Release notes](https://github.com/dtolnay/thiserror/releases) - [Commits](dtolnay/thiserror@2.0.14...2.0.15) --- updated-dependencies: - dependency-name: thiserror dependency-version: 2.0.15 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump thiserror from 2.0.15 to 2.0.16 (solana-program#126) Bumps [thiserror](https://github.com/dtolnay/thiserror) from 2.0.15 to 2.0.16. - [Release notes](https://github.com/dtolnay/thiserror/releases) - [Commits](dtolnay/thiserror@2.0.15...2.0.16) --- updated-dependencies: - dependency-name: thiserror dependency-version: 2.0.16 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps-dev): bump zx from 8.8.0 to 8.8.1 (solana-program#127) Bumps [zx](https://github.com/google/zx) from 8.8.0 to 8.8.1. - [Release notes](https://github.com/google/zx/releases) - [Commits](google/zx@8.8.0...8.8.1) --- updated-dependencies: - dependency-name: zx dependency-version: 8.8.1 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * checking in; branching out 3.0 update * use 3.0 crates * specify solana ver * try cache bust * try dedicated * update mollusk * passing mollusk tests * error matching and other various test improvements * rm old patches * use 3.0 crates (solana-program#130) * store token programs for now (until their repos use 3.0) * fmt * Use 3.0 crates (#29) *remove CI hack * sync and resolve conflicts (#30) * fix merged file * fmt * specify tokio * lockfile * fmt, clippy * rm unused * process_and_merge_instruction helper * ensure_system_account_exists helper for mollusk * few more helpers reducing LoC * a few more helpers * lint * rename vars to mollusk_result * some small test fixes * use mollusk check * split up huge fn * a little reuse * CreateAtaInstructionType default * rm async tokio * test calc helpers * move tests to harness * rm some unused * rm now-unused utils * use harness for extended mint * use breakout crates in tests * minor clarifications and cleanups * some naming updates and small utils cleanup * rm redundant mint setup * rm old comment * rm solana-program-test dep * rm dup * rm intermediate harness * rm unused fns * use account builder in more places * rm nested mod * rm unneeded interface dev deps * rm unrelated program import changes * rm worthless wrappers * rm specifiers * rm old comment from comparison version * rm submodules plan; program bins in fixtures * more mollusk checks to ensure nested ata is empty and closed * rm unnnecessary branching and specifiers; other small updates AtaTestHarness capitalization, token_2022_interface/token_interface branching rm when unneeded, rm unnecessary specifiers, wrong-account helper takes Pubkey, deprecated instruction test adds rent sysvar account, setup_mollusk_with_programsnow points to programs/tests/fixtures * move test harness to own crate * cargo lock/toml updates * rm unneeded branch: StateWithExtensionsOwned for both programs * clearer name * add ATA to spellcheck * spellcheck * merge create_ata_for_owner and create_nested_ata * remove unnecessary path setters * rm import * accurate mint authority comment * no sense having 0 lamports even when account expected to exist * unified helpers for smaller token/token-2022 tests * test-harness cargo.toml updates * use mollusk mint constructors in some locations * import lengths * rm now unnecessary prog acct prefill * rm hardcoded native loader and sys prog insertion * update ctx_ensure_account_exists_with_lamports * rm rent prefill * use helper for token2022 too * rm keypair * ren_sysvar() no longer needed, woot * fmt * use interface * rm unnecessary account insertions * simplify some setup code * simplify wallet_and_mint helper * rm now unused * rm stray keypair * lint * fmt * comment --------- Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jon C <[email protected]> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This is a draft pending testing of the latest optimizations, especially custom entrypoint.
p-ata (pinocchio-ata) is a drop-in replacement for SPL ATA. Following in the footsteps of p-token, it uses pinocchio instead of solana-program to reduce compute usage. Plus, it includes a number of additional improvements.
See README for
Optimal bump circumstances as of 2025-08-11, ecde2ca
CreateAccountPrefundedCreateAccountPrefundedAverage of 10,000 random wallets as of 2025-08-11, ecde2ca
CreateAccountPrefundedCreateAccountPrefunded